package labox.innovation.gameserver.model.actor.instance;

import labox.innovation.config.Config;
import labox.innovation.gameserver.cache.HtmCache;
import labox.innovation.gameserver.datatables.PlayerTemplateTable;
import labox.innovation.gameserver.model.base.ClassId;
import labox.innovation.gameserver.network.serverpackets.NpcHtmlMessage;
//import labox.innovation.gameserver.network.serverpackets.TutorialCloseHtml;
//import labox.innovation.gameserver.network.serverpackets.TutorialShowHtml;
//import labox.innovation.gameserver.network.serverpackets.TutorialShowQuestionMark;
import labox.innovation.gameserver.templates.chars.NpcTemplate;
import labox.innovation.gameserver.util.StringUtil;

/**
 * 职业教程处理对象，职业教程的NPC
 *
 * @version $Revision: 1.4.2.1.2.7 $ $Date: 2005/03/27 15:29:32 $
 */
public final class L2ClassMasterInstance extends FuzeNpcInstance {
	/**
	 * @param template
	 */
	public L2ClassMasterInstance(long objectId, NpcTemplate template) {
		super(objectId, template);
	}

	@Override
	public String getHtmlPath(int npcId, int val) {
		String pom = "";

		if (val == 0)
			pom = "" + npcId;
		else
			pom = npcId + "-" + val;

		return "data/html/classmaster/" + pom + ".htm";
	}

	@Override
	public void onBypassFeedback(FuzePcInstance player, String command) {
		if (command.startsWith("1stClass")) {
			showHtmlMenu(player, getObjectId(), 1);
		} else if (command.startsWith("2ndClass")) {
			showHtmlMenu(player, getObjectId(), 2);
		} else if (command.startsWith("3rdClass")) {
			showHtmlMenu(player, getObjectId(), 3);
		} else if (command.startsWith("change_class")) {
			int val = Integer.parseInt(command.substring(13));

			if (checkAndChangeClass(player, val)) {
				NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
				html.setFile("data/html/classmaster/ok.htm");
				html.replace("%name%", PlayerTemplateTable.getInstance().getClassNameById(val));
				player.sendPacket(html);
			}
		} else {
			super.onBypassFeedback(player, command);
		}
	}

	public static final void onTutorialLink(FuzePcInstance player, String request) {
//		if (!Config.ALTERNATE_CLASS_MASTER || request == null || !request.startsWith("CO"))
//			return;

		if (!player.getFloodProtectors().getServerBypass().tryPerformAction("changeclass"))
			return;

		try {
			int val = Integer.parseInt(request.substring(2));
			checkAndChangeClass(player, val);
		} catch (NumberFormatException e) {
		}
//		player.sendPacket(new TutorialCloseHtml());
	}

	public static final void onTutorialQuestionMark(FuzePcInstance player, int number) {
//		if (!Config.ALTERNATE_CLASS_MASTER || number != 1001)
//			return;

		showTutorialHtml(player);
	}

	public static final void showQuestionMark(FuzePcInstance player) {
		final ClassId classId = player.getClassId();
//		if (getMinLevel(classId.level()) > player.getLevel())
//			return;

//		player.sendPacket(new TutorialShowQuestionMark(1001));
	}

	private static final void showHtmlMenu(FuzePcInstance player, long objectId, int level) {
		NpcHtmlMessage html = new NpcHtmlMessage(objectId);

		if (!Config.ALLOW_CLASS_MASTERS) {
			html.setFile("data/html/classmaster/disabled.htm");
		} else {
//			final ClassId currentClassId = player.getClassId();
//			if (currentClassId.level() >= level) {
//				html.setFile("data/html/classmaster/nomore.htm");
//			} else {
//				final int minLevel = getMinLevel(currentClassId.level());
//				if (player.getLevel() >= minLevel || Config.ALLOW_ENTIRE_TREE) {
//					final StringBuilder menu = new StringBuilder(100);
//					for (ClassId cid : ClassId.values()) {
//						if (validateClassId(currentClassId, cid) && cid.level() == level) {
//							StringUtil.append(menu, "<a action=\"bypass -h npc_%objectId%_change_class ", String.valueOf(cid.getId()), "\">", PlayerTemplateTable.getInstance().getClassNameById(cid.getId()), "</a><br>");
//						}
//					}
//
//					if (menu.length() > 0) {
//						html.setFile("data/html/classmaster/template.htm");
//						html.replace("%name%", PlayerTemplateTable.getInstance().getClassNameById(currentClassId.getId()));
//						html.replace("%menu%", menu.toString());
//					} else {
//						html.setFile("data/html/classmaster/comebacklater.htm");
//						html.replace("%level%", String.valueOf(getMinLevel(level - 1)));
//					}
//				} else {
//					if (minLevel < Integer.MAX_VALUE) {
//						html.setFile("data/html/classmaster/comebacklater.htm");
//						html.replace("%level%", String.valueOf(minLevel));
//					} else
//						html.setFile("data/html/classmaster/nomore.htm");
//				}
//			}
		}

		html.replace("%objectId%", String.valueOf(objectId));
		player.sendPacket(html);
	}

	private static final void showTutorialHtml(FuzePcInstance player) {
		final ClassId currentClassId = player.getClassId();
//		if (getMinLevel(currentClassId.level()) > player.getLevel() && !Config.ALLOW_ENTIRE_TREE)
//			return;

		String msg = HtmCache.getInstance().getHtm("data/html/classmaster/tutorialtemplate.htm");

		msg = msg.replaceAll("%name%", PlayerTemplateTable.getInstance().getClassNameById(currentClassId.getId()));

		final StringBuilder menu = new StringBuilder(100);
		for (ClassId cid : ClassId.values()) {
			if (validateClassId(currentClassId, cid)) {
				StringUtil.append(menu, "<a action=\"link CO", String.valueOf(cid.getId()), "\">", PlayerTemplateTable.getInstance().getClassNameById(cid.getId()), "</a><br>");
			}
		}

		msg = msg.replaceAll("%menu%", menu.toString());
//		player.sendPacket(new TutorialShowHtml(msg));
	}

	private static final boolean checkAndChangeClass(FuzePcInstance player, int val) {
		final ClassId currentClassId = player.getClassId();
//		if (getMinLevel(currentClassId.level()) > player.getLevel() && !Config.ALLOW_ENTIRE_TREE)
//			return false;

		if (!validateClassId(currentClassId, val))
			return false;

//		player.setClassId(val);

		
//		player.setBaseClass(player.getActiveClass());

		player.broadcastUserInfo();
		return true;
	}

	/**
	 * Returns minimum player level required for next class transfer
	 * @param level - current skillId level (0 - start, 1 - first, etc)
	 */
	private static final int getMinLevel(int level) {
		switch (level) {
		case 0:
			return 20;
		case 1:
			return 40;
		case 2:
			return 76;
		default:
			return Integer.MAX_VALUE;
		}
	}

	/**
	 * Returns true if class change is possible
	 * @param oldCID current player ClassId
	 * @param val new class index
	 * @return
	 */
	private static final boolean validateClassId(ClassId oldCID, int val) {
		try {
			return validateClassId(oldCID, ClassId.values()[val]);
		} catch (Exception e) {
			// possible ArrayOutOfBoundsException
		}
		return false;
	}

	/**
	 * Returns true if class change is possible
	 * @param oldCID current player ClassId
	 * @param newCID new ClassId
	 * @return true if class change is possible
	 */
	private static final boolean validateClassId(ClassId oldCID, ClassId newCID) {
		if (newCID == null)
			return false;

//		if (oldCID.equals(newCID.getParent()))
//			return true;
//
//		if (Config.ALLOW_ENTIRE_TREE && newCID.childOf(oldCID))
//			return true;

		return false;
	}
}
